package lab8;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

/**
 * @author wangcheng 本类继承自Mapper类，负责重写Mapper中的map方法 Mapper < LongWritable , Text
 *         , Text , IntWritable >泛型参数含义：
 *         LongWritable表示文本偏移量相当于读取文本行的地址，由MapReducer框架启动时自动根据文件获取，
 *         Text表示读取的一行文本 第二个Text表示map方法输出key的类型 IntWritable表示map函数输出的value类型
 */

public class UidMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

	// 创建用户搜素次数的单位为1，只要产生一条记录就会标识为1
	private static final IntWritable one = new IntWritable(1);
	// 创建Text文本对象用以记录用户的Uid信息
	private Text UidText = new Text();

	/**
	 * key代表500万条记录数据文件时文本行的偏移量地址 value代表读取的500万条记录中的某一行记录，有MapReducer框架负责传入
	 * context是MapReducer框架的上下文对象，可以存放公共类型数据，比如map
	 * 方法处理完的中间结果可以保存到context上下文对象中，MapReducer框架
	 * 再根据上下文对象中的数据将其持久化到本地磁盘，这都是MapReducer框架来完成的
	 */

	public void map(LongWritable key, Text value,
			org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws java.io.IOException, InterruptedException {
		// 将读取的一行Text文本转化为Java的字符串类型
		String line = value.toString();
		// 按照制表符切分出一行字符串中包含的所有词，并存到字符串数组中
		String[] arr = line.split("\t");
		// 判断字符串数组部位NULL并且数组的长度为6
		if (null != arr && arr.length == 6) {
			// 获取字符串数组中第二个字段，也就是Uid字段的值
			String uid = arr[1];
			if (null != uid && !"".equals(uid.trim())) {
				// 将Uid字符串转化为Text类型
				UidText.set(uid);
				// map函数的最终输出结果key为Uid，value为1
				context.write(UidText, one);
			}
		}
	}
}
